# -*- coding: utf-8 -*-

#abordagem imperativa
def serie_iter(n):
    '''
    serie geometrica
    '''

    k = 0
    soma = 0.0

    while k <=n:
        soma += 1.0 / (2.0 ** k)
        k += 1
        pass
    return soma

#abordagem funcional
def serie_fun(n):
    if n == 0:
        return 1.0
    else:
        return 1.0 / (2.0 ** n) + serie_fun(n-1)

#abordagem funcional 2
#usando os recursos da linguagem Python
def serie_fun2(n):
    return reduce(lambda x, k: x + 1.0 / (2.0 ** k), range(0,n+1))

for k in range(21):
    print k, serie_iter(k), serie_fun(k), serie_fun2(k)
